import { IContext, IEntityLocalDataService, IParam } from '@/core';
import { IAUTH_LOG } from '../interface/i-auth-log';
import keys from '../auth-log-keys';

/**
 * Auth_logDTODTO辅助类
 * 基于template/src/api/{{appEntities}}/data-service/{{appEntities}}-help.ts.hbs生成
 *
 * @export
 * @class Auth_logDTOHelp
 */
export class Auth_logDTOHelp {
	/**
	 * 获取实体数据服务
	 *
	 * @static
	 * @param {IParam} context
	 * @return {*}  {Promise<IEntityLocalDataService<IAUTH_LOG>>}
	 * @memberof Auth_logDTOHelp
	 */
	public static async getService(
		context: IParam
	): Promise<IEntityLocalDataService<IAUTH_LOG>> {
		return App.getDataService('AUTH_LOG', context);
	}

	/**
	 * 获取是否缓存
	 *
	 * @memberof Auth_logDTOHelp
	 */
	public static getEnableCache() {
		return false;
	}

	/**
	 * DTO转化成数据对象
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @param {IParam} source dto对象
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async toDataObj(context: IContext, source: IParam) {
		const _data: any = {};
		//  id
		_data.id = source.id;
		//  登录时间（数据库）
		_data.timestmp = source.timestmp;
		//  日志消息
		_data.message = source.message;
		//  日志名称
		_data.name = source.name;
		//  日志级别
		_data.log_level = source.log_level;
		//  登录地址
		_data.ip_address = source.ip_address;
		//  登录状态
		_data.status = source.status;
		//  调用者文件名
		_data.caller_filename = source.caller_filename;
		//  调用者类名
		_data.caller_class = source.caller_class;
		//  调用者方法名
		_data.caller_method = source.caller_method;
		//  代码行
		_data.caller_line = source.caller_line;
		//  参数1
		_data.arg0 = source.arg0;
		//  参数2
		_data.arg1 = source.arg1;
		//  参数3
		_data.arg2 = source.arg2;
		//  参数4
		_data.arg3 = source.arg3;
		//  登录时间
		_data.time = source.time;
		//  处理预置字段（以srf开头）
		if (source && Object.keys(source).length > 0) {
			Object.keys(source).forEach((key: string) => {
				if (key.startsWith('srf')) {
					_data[key] = source[key];
				}
			});
		}
		return _data;
	}

	/**
	 * 转化数据（DTO转化成数据对象）
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @param {IParam} data 数据对象
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async toDataObjArray(context: IContext, data: any[]) {
		const _data: any[] = [];
		if (data && Array.isArray(data) && data.length > 0) {
			for (let i = 0; i < data.length; i++) {
				const tempdata = await this.toDataObj(context, data[i]);
				_data.push(tempdata);
			}
		}
		return _data;
	}

	/**
	 * 数据对象转化成DTO
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @param {IParam} source 数据对象
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async toDto(context: IContext, source: IParam) {
		const _data: any = {};
		const excludes: string[] = [];
		//  id
		if (source.hasOwnProperty('id')) {
			_data.id = source.id;
		}
		//  登录时间（数据库）
		if (source.hasOwnProperty('timestmp')) {
			_data.timestmp = source.timestmp;
		}
		//  日志消息
		if (source.hasOwnProperty('message')) {
			_data.message = source.message;
		}
		//  日志名称
		if (source.hasOwnProperty('name')) {
			_data.name = source.name;
		}
		//  日志级别
		if (source.hasOwnProperty('log_level')) {
			_data.log_level = source.log_level;
		}
		//  登录地址
		if (source.hasOwnProperty('ip_address')) {
			_data.ip_address = source.ip_address;
		}
		//  登录状态
		if (source.hasOwnProperty('status')) {
			_data.status = source.status;
		}
		//  调用者文件名
		if (source.hasOwnProperty('caller_filename')) {
			_data.caller_filename = source.caller_filename;
		}
		//  调用者类名
		if (source.hasOwnProperty('caller_class')) {
			_data.caller_class = source.caller_class;
		}
		//  调用者方法名
		if (source.hasOwnProperty('caller_method')) {
			_data.caller_method = source.caller_method;
		}
		//  代码行
		if (source.hasOwnProperty('caller_line')) {
			_data.caller_line = source.caller_line;
		}
		//  参数1
		if (source.hasOwnProperty('arg0')) {
			_data.arg0 = source.arg0;
		}
		//  参数2
		if (source.hasOwnProperty('arg1')) {
			_data.arg1 = source.arg1;
		}
		//  参数3
		if (source.hasOwnProperty('arg2')) {
			_data.arg2 = source.arg2;
		}
		//  参数4
		if (source.hasOwnProperty('arg3')) {
			_data.arg3 = source.arg3;
		}
		//  登录时间
		if (source.hasOwnProperty('time')) {
			_data.time = source.time;
		}
		// 附加额外数据
		if (source && Object.keys(source).length > 0 && keys) {
			Object.keys(source).forEach((key: string) => {
				if (!keys.includes(key) && !excludes.includes(key)) {
					_data[key] = source[key];
				}
			});
		}
		return _data;
	}

	/**
	 * 转化数组(数据对象转化成DTO数组)
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @param {IParam[]} data 数据对象
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async toDtoArray(context: IContext, data: IParam[]) {
		const _data: any[] = [];
		if (data && Array.isArray(data) && data.length > 0) {
			for (let i = 0; i < data.length; i++) {
				const tempdata = await this.toDto(context, data[i]);
				_data.push(tempdata);
			}
		}
		return _data;
	}

	/**
	 * 处理响应DTO对象
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @param {IParam} data 数据对象
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async set(context: IContext, data: IParam) {
		const _data: IParam = await this.toDataObj(context, data);
		return _data;
	}

	/**
	 * 处理请求数据对象
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @param {IParam} data 数据对象
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async get(context: IContext, data: IParam = {}) {
		return await this.toDto(context, data);
	}

	/**
	 * 获取缓存数据
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @param {string} srfkey 数据主键
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async getCacheData(context: IContext, srfkey: string) {
		return {};
	}

	/**
	 * 获取缓存数组
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async getCacheDataArray(context: IContext) {
		return [];
	}

	/**
	 * 设置缓存数据
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @param {IParam} data 数据
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async setCacheData(context: IContext, data: IParam) {}

	/**
	 * 设置缓存数组
	 *
	 * @static
	 * @param {IContext} context 应用上下文
	 * @param {any[]} data 数据
	 * @return {*}
	 * @memberof Auth_logDTOHelp
	 */
	public static async setCacheDataArray(context: IContext, data: any[]) {}
}
